{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对应 `tf.keras` 的01~02章节"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T09:34:00.199453Z",
     "start_time": "2025-03-05T09:34:00.194815Z"
    }
   },
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "from tqdm.auto import tqdm  # 进度条\n",
    "import torch  # PyTorch\n",
    "import torch.nn as nn  # 神经网络模块\n",
    "import torch.nn.functional as F\n",
    "\n",
    "print(sys.version_info)\n",
    "# 打印各模块的版本\n",
    "for module in mpl, np, pd, sklearn, torch:\n",
    "    print(module.__name__, module.__version__)\n",
    "# 打印cuda信息\n",
    "device = torch.device(\"cuda:0\") if torch.cuda.is_available() else torch.device(\"cpu\")\n",
    "print(device)\n"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sys.version_info(major=3, minor=12, micro=3, releaselevel='final', serial=0)\n",
      "matplotlib 3.9.1\n",
      "numpy 2.0.0\n",
      "pandas 2.2.2\n",
      "sklearn 1.6.1\n",
      "torch 2.6.0+cu126\n",
      "cuda:0\n"
     ]
    }
   ],
   "execution_count": 38
  },
  {
   "cell_type": "code",
   "source": "28 * 28",
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-05T09:34:00.316882Z",
     "start_time": "2025-03-05T09:34:00.313345Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "784"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 39
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": "## 数据准备1，为了看灰度图片"
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T09:34:00.348961Z",
     "start_time": "2025-03-05T09:34:00.324885Z"
    }
   },
   "source": [
    "from torchvision import datasets  # torchvision 是一个用于计算机视觉的开源库\n",
    "from torchvision.transforms import ToTensor\n",
    "from torchvision import transforms\n",
    "\n",
    "# 定义数据集的变换.图片变为tensor,现在什么都没做，就不会变成tensor\n",
    "transform = transforms.Compose([\n",
    "])\n",
    "# fashion_mnist图像分类数据集，衣服分类，60000张训练图片，10000张测试图片\n",
    "train_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=True,\n",
    "    download=True,\n",
    "    transform=transform  # 现在还没转换，可以写None\n",
    ")\n",
    "\n",
    "# 可以去官网看数据集的说明，里面有标签说明\n",
    "test_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=False,\n",
    "    download=True,\n",
    "    transform=transform\n",
    ")\n",
    "\n",
    "# torchvision 数据集里没有提供训练集和验证集的划分\n",
    "# 当然也可以用 torch.utils.data.Dataset 实现人为划分"
   ],
   "outputs": [],
   "execution_count": 40
  },
  {
   "cell_type": "code",
   "source": [
    "type(train_ds)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-05T09:34:00.352119Z",
     "start_time": "2025-03-05T09:34:00.348961Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torchvision.datasets.mnist.FashionMNIST"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 41
  },
  {
   "cell_type": "code",
   "source": "len(train_ds)  # 60000个训练样本",
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-05T09:34:00.358791Z",
     "start_time": "2025-03-05T09:34:00.352119Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "60000"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 42
  },
  {
   "cell_type": "code",
   "source": "type(train_ds[0])  # ",
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-05T09:34:00.365220Z",
     "start_time": "2025-03-05T09:34:00.361794Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tuple"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 43
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T09:34:00.377319Z",
     "start_time": "2025-03-05T09:34:00.375223Z"
    }
   },
   "source": [
    "# 通过id取数据，取到的是一个元祖,是第一个样本,在训练时，把特征和标签分开\n",
    "img, label = train_ds[0]"
   ],
   "outputs": [],
   "execution_count": 44
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T09:34:00.392761Z",
     "start_time": "2025-03-05T09:34:00.390323Z"
    }
   },
   "cell_type": "code",
   "source": "type(img)  #tensor中文是 张量,和numpy的ndarray类似",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PIL.Image.Image"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 45
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T09:34:00.418492Z",
     "start_time": "2025-03-05T09:34:00.415271Z"
    }
   },
   "cell_type": "code",
   "source": "img",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<PIL.Image.Image image mode=L size=28x28>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAACD0lEQVR4AbWRz2sTQRTH38zszm42k6Q2TU2ixURstRdRasWC9FCsUE9SpIKnKl48+x94UOjNiyf/h4KgKN7TYgNKK+agjZS0wZDYbND90dn54VqxIWfxXebBB97nfecB/P9CAKkFAGT8ViEEh+9fLZZn7gde+E4AwkgAGYBEzl3btZz55y0tgSl/AHKYLhH85uJKdat2ebqyFmuOCun5laFIwcYXjvLRxq1nfRh3er0ESHAI1fvPYqF8oj9WxxO6hcAyWZhQV2fw6OvBbcEh2O/tlxTCjlRjgPtGAqwYcpN7GWUlPbppXepDTeB2AduQHONWpOzsi09GHxocPobUccZPh8RhcvfOy/V4IUQwigMIgFdeQHWb2BFEipzvxU6iBT9QALNPq8F3oYTnSRt8oN4iHOYcLk4UFs+GOEo0TZrlToXNqp7ZmkQw8yg3JIkrHI6C2lI1dawE9dQPP8HSDiJrRSF9IAFAZmT5+oNm+LU+nuVmispT6N6TbcYsMDONZg7nb9rl5NQU5pgCMq8YrUY6bDCa3t9hQShWt0rD3I0kNxWiE8aebiRH3E7bsEw7hTuTXqNrdSIRJfK9C8aH1bvNesioTcmB1P43JY2QcdeNRLkVR7nx8HjblYQaBGnTpCYC1AKq8ptLCMf55x6PZjAxJGrpPfWTgI58/LZW+fMJ8WXO5bond/j20Y3+sfkFaCTYdrBYeB0AAAAASUVORK5CYII=",
      "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCAAcABwBAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/APn+tbw1oNx4m8QWmkWx2yXD4LkZCADJJ+gFbviL4a63oc7COE3MW4hdn38duD976jNc9daDqllIsc9lKrMu4YGeMkdR7gj8KzcV7H8BtEvV16+1iWCeG1Wz8mOV02pIzupwCeuAp6Z98cZ90aIzLIlw0c0ZJ4KgjHoeOa+evjS9n/wnMcNxBPCYLKONFhA2FNzMpGenDcgd816V4K03wefC+m3NlpVhP+5QSXBiR5fMx825iMg5zwce3FdbOzTwgW90lu6uCm8eYrL02soIyCPQgggEdMGQ3cluiPNK0rJwrRQBNueuMkt+teNfGKxsdY8WWdxNqcNo66eieXMwVsb5DnH415Hp2rajpE5n02/urOUjBe3laMkehIPIrVm8eeLrhNknibVivoLtx/I1UPinxC3XXtUP1vJP8ay5JZJpGkldnduSzHJP41//2Q=="
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 46
  },
  {
   "cell_type": "code",
   "source": [
    "type(img)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-05T09:34:00.431142Z",
     "start_time": "2025-03-05T09:34:00.428495Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PIL.Image.Image"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 47
  },
  {
   "cell_type": "code",
   "source": [
    "label"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-05T09:34:00.443687Z",
     "start_time": "2025-03-05T09:34:00.441146Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "9"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 48
  },
  {
   "cell_type": "code",
   "source": [
    "# 显示图片，这里需要把transforms.ToTensor(),进行归一化注释掉，否则是不行的\n",
    "def show_img_content(img):\n",
    "    from PIL import Image\n",
    "\n",
    "    # 打开一个图像文件\n",
    "    # img = Image.open(img)\n",
    "\n",
    "    print(\"图像大小:\", img.size)\n",
    "    print(\"图像模式:\", img.mode)\n",
    "\n",
    "    # 如果图像是单通道的，比如灰度图，你可以这样获取像素值列表：\n",
    "    if img.mode == 'L':  # L表示灰度图\n",
    "        pixel_values = list(img.getdata())\n",
    "        print(pixel_values)\n",
    "\n",
    "\n",
    "show_img_content(img)  #这里必须把上面的 transforms.ToTensor(), # 转换为tensor，进行归一化注释掉，否则是不行的"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-05T09:34:00.468108Z",
     "start_time": "2025-03-05T09:34:00.464690Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "图像大小: (28, 28)\n",
      "图像模式: L\n",
      "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 13, 73, 0, 0, 1, 4, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 36, 136, 127, 62, 54, 0, 0, 0, 1, 3, 4, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 102, 204, 176, 134, 144, 123, 23, 0, 0, 0, 0, 12, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 236, 207, 178, 107, 156, 161, 109, 64, 23, 77, 130, 72, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 69, 207, 223, 218, 216, 216, 163, 127, 121, 122, 146, 141, 88, 172, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 200, 232, 232, 233, 229, 223, 223, 215, 213, 164, 127, 123, 196, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, 225, 216, 223, 228, 235, 227, 224, 222, 224, 221, 223, 245, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 228, 218, 213, 198, 180, 212, 210, 211, 213, 223, 220, 243, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 12, 219, 220, 212, 218, 192, 169, 227, 208, 218, 224, 212, 226, 197, 209, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 99, 244, 222, 220, 218, 203, 198, 221, 215, 213, 222, 220, 245, 119, 167, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 55, 236, 228, 230, 228, 240, 232, 213, 218, 223, 234, 217, 217, 209, 92, 0, 0, 0, 1, 4, 6, 7, 2, 0, 0, 0, 0, 0, 237, 226, 217, 223, 222, 219, 222, 221, 216, 223, 229, 215, 218, 255, 77, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 62, 145, 204, 228, 207, 213, 221, 218, 208, 211, 218, 224, 223, 219, 215, 224, 244, 159, 0, 0, 0, 0, 0, 18, 44, 82, 107, 189, 228, 220, 222, 217, 226, 200, 205, 211, 230, 224, 234, 176, 188, 250, 248, 233, 238, 215, 0, 0, 57, 187, 208, 224, 221, 224, 208, 204, 214, 208, 209, 200, 159, 245, 193, 206, 223, 255, 255, 221, 234, 221, 211, 220, 232, 246, 0, 3, 202, 228, 224, 221, 211, 211, 214, 205, 205, 205, 220, 240, 80, 150, 255, 229, 221, 188, 154, 191, 210, 204, 209, 222, 228, 225, 0, 98, 233, 198, 210, 222, 229, 229, 234, 249, 220, 194, 215, 217, 241, 65, 73, 106, 117, 168, 219, 221, 215, 217, 223, 223, 224, 229, 29, 75, 204, 212, 204, 193, 205, 211, 225, 216, 185, 197, 206, 198, 213, 240, 195, 227, 245, 239, 223, 218, 212, 209, 222, 220, 221, 230, 67, 48, 203, 183, 194, 213, 197, 185, 190, 194, 192, 202, 214, 219, 221, 220, 236, 225, 216, 199, 206, 186, 181, 177, 172, 181, 205, 206, 115, 0, 122, 219, 193, 179, 171, 183, 196, 204, 210, 213, 207, 211, 210, 200, 196, 194, 191, 195, 191, 198, 192, 176, 156, 167, 177, 210, 92, 0, 0, 74, 189, 212, 191, 175, 172, 175, 181, 185, 188, 189, 188, 193, 198, 204, 209, 210, 210, 211, 188, 188, 194, 192, 216, 170, 0, 2, 0, 0, 0, 66, 200, 222, 237, 239, 242, 246, 243, 244, 221, 220, 193, 191, 179, 182, 182, 181, 176, 166, 168, 99, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 61, 44, 72, 41, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n"
     ]
    }
   ],
   "execution_count": 49
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "一个像素就是一个数，0-255，0表示黑色，255表示白色，中间的数字表示不同的灰度。一个字节就是8位，也就是2的8次方，所以一个像素占用一个字节。\n",
    "\n",
    "rgb3色 rgb的三个通道，每个通道8位，所以一个像素占用3个字节，所以一张图片的大小是宽乘高乘3。"
   ]
  },
  {
   "cell_type": "code",
   "source": [
    "#这个代码必须是注释了上面的 transforms.ToTensor()才能够运行的\n",
    "def show_single_image(img_arr):\n",
    "    plt.imshow(img_arr, cmap=\"binary\")  # 显示图片\n",
    "    plt.colorbar()  # 显示颜色条\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "show_single_image(img)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-05T09:34:00.542323Z",
     "start_time": "2025-03-05T09:34:00.478112Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 50
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 数据准备2，为训练做准备"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T09:34:00.567371Z",
     "start_time": "2025-03-05T09:34:00.542323Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from torchvision import datasets\n",
    "from torchvision.transforms import ToTensor\n",
    "from torchvision import transforms\n",
    "\n",
    "mean = 0.2860\n",
    "std = 0.3205\n",
    "\n",
    "# 定义数据集的变换\n",
    "transform = transforms.Compose([\n",
    "    transforms.ToTensor(),  # 转换为tensor，进行归一化（变为0-1之间），只是格式变了，数据没变 ，变成了浮点数\n",
    "    # transforms.Normalize(mean, std) # 标准化，mean和std是数据集的均值和方差\n",
    "])\n",
    "# fashion_mnist图像分类数据集，衣服分类，60000张训练图片，10000张测试图片\n",
    "train_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=True,\n",
    "    download=True,\n",
    "    transform=transform\n",
    ")\n",
    "\n",
    "test_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=False,\n",
    "    download=True,\n",
    "    transform=transform\n",
    ")\n",
    "\n",
    "# torchvision 数据集里没有提供训练集和验证集的划分\n",
    "# 当然也可以用 torch.utils.data.Dataset 实现人为划分"
   ],
   "outputs": [],
   "execution_count": 51
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T09:34:00.570653Z",
     "start_time": "2025-03-05T09:34:00.567371Z"
    }
   },
   "cell_type": "code",
   "source": [
    "img_tensor, label = train_ds[0]\n",
    "img_tensor.shape  #img这时是一个tensor，shape=(1, 28, 28)"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([1, 28, 28])"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 52
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T09:34:00.576658Z",
     "start_time": "2025-03-05T09:34:00.571657Z"
    }
   },
   "cell_type": "code",
   "source": "type(img_tensor)",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Tensor"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 53
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T09:34:00.582656Z",
     "start_time": "2025-03-05T09:34:00.576658Z"
    }
   },
   "cell_type": "code",
   "source": "label",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "9"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 54
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T09:34:04.771632Z",
     "start_time": "2025-03-05T09:34:00.582656Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#计算均值和方差\n",
    "def cal_mean_std(ds):\n",
    "    mean = 0.\n",
    "    std = 0.\n",
    "    for img, _ in ds:  # 遍历每张图片,img.shape=[1,28,28]\n",
    "        mean += img.mean(dim=(1, 2))  # 计算每张图片的均值，dim=(1, 2)表示计算每张图片的每一个像素的均值,行列共同求均值\n",
    "        std += img.std(dim=(1, 2))\n",
    "    mean /= len(ds)\n",
    "    std /= len(ds)\n",
    "    return mean, std\n",
    "\n",
    "\n",
    "print(cal_mean_std(train_ds))\n"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(tensor([0.2860]), tensor([0.3205]))\n"
     ]
    }
   ],
   "execution_count": 55
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T09:34:05.050139Z",
     "start_time": "2025-03-05T09:34:04.771632Z"
    }
   },
   "source": [
    "def show_imgs(n_rows, n_cols, train_ds, class_names):\n",
    "    assert n_rows * n_cols < len(train_ds)  #确保打印的图片小于总样本数\n",
    "    plt.figure(figsize=(n_cols * 1.4, n_rows * 1.6))  #宽1.4高1.6，宽，高\n",
    "    for row in range(n_rows):\n",
    "        for col in range(n_cols):\n",
    "            index = n_cols * row + col  # 计算索引，从0开始\n",
    "            plt.subplot(n_rows, n_cols, index + 1)  #因为从1开始\n",
    "            img_arr, label = train_ds[index]\n",
    "            img_arr = np.transpose(img_arr, (1, 2, 0))  # 通道换到最后一维,shape=(28,28,1)\n",
    "            plt.imshow(img_arr, cmap=\"binary\",\n",
    "                       interpolation='nearest')  #interpolation='nearest'是临近插值\n",
    "            plt.axis('off')  #去除坐标系\n",
    "            plt.title(class_names[label])  # 显示类别名称\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "#已知的图片类别\n",
    "# lables在这个路径https://github.com/zalandoresearch/fashion-mnist\n",
    "class_names = ['T-shirt', 'Trouser', 'Pullover', 'Dress',\n",
    "               'Coat', 'Sandal', 'Shirt', 'Sneaker',\n",
    "               'Bag', 'Ankle boot']  #0-9分别代表的类别\n",
    "#只是打印了前15个样本\n",
    "show_imgs(3, 5, train_ds, class_names)\n"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 700x480 with 15 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjIAAAGMCAYAAADA5EjBAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB9U0lEQVR4nO2dd3gWVdrG7wgkwdAhAUIJEEC6aKgKhqaRKiCCKAKigAoqu64suquAdVGKlWZBxbgUDVKWIggWmlKkiCAtoKL0FkCJkPn+8Mr5nvMkM7yEtEnu33V5+UzmvDPnnXPOvIenBjmO44AQQgghxIdcldMdIIQQQgjJKNzIEEIIIcS3cCNDCCGEEN/CjQwhhBBCfAs3MoQQQgjxLdzIEEIIIcS3cCNDCCGEEN/CjQwhhBBCfAs3MoQQQgjxLblqI9O/f38UKVLkku1atWqFVq1aZdp9W7VqhXr16mXa9UjmsG/fPgQFBWHs2LGXbDtq1CgEBQVlQ69IoHD8CMlZ8ssavOKNzMSJExEUFISmTZtmRn/yHS+88AI+/fTTnO5GhggKCgrovy+++CKnu2px7tw5jBo1Ktf1K7vh+OU93nvvPWvsQkNDERkZibi4OLz22mtISkrK6S4SAddg5lDwSi8QHx+PKlWq4Ntvv8Xu3btRvXr1zOhXvuGFF15Ajx490LVr15zuymUzffp06/iDDz7A0qVL0/y9du3aWd6Xf//73xgxYkRAbc+dO4fRo0cDQKZq9vwGxy/v8swzz6Bq1ar4888/cfDgQXzxxRcYNmwYxo8fj3nz5qFBgwY53UUCrsHM4oo2MomJiVi9ejUSEhIwePBgxMfHY+TIkZnVN5LL6dOnj3W8du1aLF26NM3fs4OCBQuiYEHv6ZySkoLk5ORs6lHuh+OXd2nfvj0aNWpkjp944gksX74cnTp1QpcuXbB9+3YULlw43c+ePXsWYWFh2dXVfA3XYOZwRaal+Ph4lCxZEh07dkSPHj0QHx+fpo200U2dOhXR0dEICQlB48aNsW7dukveY9OmTQgPD0erVq1w5swZ13bnz5/HyJEjUb16dYSEhKBSpUoYPnw4zp8/H/D32bBhA2644QYULlwYVatWxeTJk9O0OXz4MO677z6ULVsWoaGhuPbaa/H++++naXf27Fk89thjqFSpEkJCQnDNNddg7NixkMXGg4KCcPbsWbz//vtGhdi/f/+A++t31q9fj7i4OJQpU8Y88wEDBqTb9lJzJz37blBQEIYOHYr4+HjUrVsXISEhmDx5MsLDwwEAo0ePNs991KhRWfId8zIcP3/Rpk0bPPXUU9i/fz8+/PBDAP/vl7hnzx506NABRYsWxd133w3grx+tV155BXXr1kVoaCjKli2LwYMH48SJE9Z1A5kHM2bMQExMDIoWLYpixYqhfv36ePXVV7Pni+dhuAb/4oo0MvHx8ejevTuCg4PRu3dvTJo0CevWrUPjxo3TtP3oo4+QlJSEwYMHIygoCC+99BK6d++OvXv3olChQulef926dYiLi0OjRo0wd+5c139BpKSkoEuXLli5ciUGDRqE2rVrY+vWrZgwYQJ27twZkA/KiRMn0KFDB/Ts2RO9e/fGrFmz8OCDDyI4ONhMjN9//x2tWrXC7t27MXToUFStWhWzZ89G//79cfLkSTz66KMAAMdx0KVLF6xYsQL33XcfGjZsiCVLluDxxx/HgQMHMGHCBAB/qRXvv/9+NGnSBIMGDQIAREdHX7KveYHDhw/jlltuQXh4OEaMGIESJUpg3759SEhISNM2I3MnleXLl2PWrFkYOnQoypQpg2uvvRaTJk3Cgw8+iG7duqF79+4AQFX7ZcLx8yf33HMPnnzySXz22WcYOHAgAODChQuIi4tDixYtMHbsWFx99dUAgMGDB+O9997Dvffei0ceeQSJiYl444038N1332HVqlUoVKhQQPNg6dKl6N27N9q2bYsxY8YAALZv345Vq1aZdya5fLgGBU4GWb9+vQPAWbp0qeM4jpOSkuJUrFjRefTRR612iYmJDgCndOnSzvHjx83f586d6wBw5s+fb/7Wr18/JywszHEcx1m5cqVTrFgxp2PHjs4ff/xhXTM2NtaJjY01x9OnT3euuuoq5+uvv7baTZ482QHgrFq1yvO7xMbGOgCccePGmb+dP3/eadiwoRMREeEkJyc7juM4r7zyigPA+fDDD0275ORkp3nz5k6RIkWc06dPO47jOJ9++qkDwHnuuees+/To0cMJCgpydu/ebf4WFhbm9OvXz7N/fmHIkCFOoFNqzpw5DgBn3bp1rm0uZ+6MHDkyzb0BOFdddZWzbds26+9HjhxxADgjR44MqK/5BY6f/5k2bdolx6V48eLOdddd5zjOX+9cAM6IESOsNl9//bUDwImPj7f+vnjxYuvvgcyDRx991ClWrJhz4cKFjH6tfAPXYMbIsGkpPj4eZcuWRevWrQH8pYLq1asXZsyYgYsXL6Zp36tXL5QsWdIct2zZEgCwd+/eNG1XrFiBuLg4tG3bFgkJCQgJCfHsy+zZs1G7dm3UqlULR48eNf+1adPGXO9SFCxYEIMHDzbHwcHBGDx4MA4fPowNGzYAABYuXIhy5cqhd+/epl2hQoXwyCOP4MyZM/jyyy9NuwIFCuCRRx6x7vHYY4/BcRwsWrTokv3J65QoUQIAsGDBAvz555+ebS9n7mhiY2NRp06djHeUpAvHz78UKVIkTfTSgw8+aB3Pnj0bxYsXx80332y9U2NiYlCkSBHzTg1kHpQoUQJnz57F0qVLM//L5GO4Bv+fDG1kLl68iBkzZqB169ZITEzE7t27sXv3bjRt2hSHDh3C559/nuYzlStXto5TH6q2t/7xxx/o2LEjrrvuOsyaNQvBwcGX7M+uXbuwbds2hIeHW//VrFkTwF8quEsRGRmZxsEt9fP79u0DAOzfvx81atTAVVfZjy3Vo3z//v3m/5GRkShatKhnu/zAmTNncPDgQfPfkSNHAPy1OG6//XaMHj0aZcqUwW233YZp06al69MU6NxJj6pVq2bCt8i/cPzyHmfOnLHeTQULFkTFihWtNrt27cKpU6cQERGR5r165swZ804NZB489NBDqFmzJtq3b4+KFStiwIABWLx4cfZ82TwA1+ClydBGZvny5fjtt98wY8YM1KhRw/zXs2dPAEjX6bdAgQLpXssRzq8AEBISgo4dO+Kbb74JeLKnpKSgfv36WLp0abr/PfTQQ5f5DUlmMXbsWJQvX978l+o/FRQUhI8//hhr1qzB0KFDceDAAQwYMAAxMTFpnLoDnTvp4eZXRQKD45e3+OWXX3Dq1CkrTUZISEiaf5ylpKQgIiLC9Z36zDPPAAhsHkRERGDTpk2YN2+e8R1s3749+vXrl31f3MdwDV6aDDn7xsfHIyIiAm+++WaacwkJCZgzZw4mT56coQcQFBSE+Ph43HbbbbjjjjuwaNGiS8apR0dHY/PmzWjbtm2GMxP++uuvacIOd+7cCQCoUqUKACAqKgpbtmxBSkqKtfB37Nhhzqf+f9myZUhKSrL+5aPbpX7fvEzfvn3RokULc6znRLNmzdCsWTM8//zz+Oijj3D33XdjxowZuP/++7OsT3n9mWcmHL+8RWp+kri4OM920dHRWLZsGW688caA3uOXmgfBwcHo3LkzOnfujJSUFDz00EOYMmUKnnrqKeYeuwRcg5fmsjUyv//+OxISEtCpUyf06NEjzX9Dhw5FUlIS5s2bl+FOBQcHIyEhAY0bN0bnzp3x7bfferbv2bMnDhw4gLfeeivd/p49e/aS97xw4QKmTJlijpOTkzFlyhSEh4cjJiYGANChQwccPHgQM2fOtD73+uuvo0iRIoiNjTXtLl68iDfeeMO6x4QJExAUFIT27dubv4WFheHkyZOX7J9fqVatGtq1a2f+u/HGGwH8pdLU/xpo2LAhAFxWyHxGSI3KyMvPPbPg+OUdli9fjmeffRZVq1Y1IdZu9OzZExcvXsSzzz6b5tyFCxfMsw9kHhw7dsw6f9VVV5kIl6yeK3kBrsFLc9kamXnz5iEpKQldunRJ93yzZs0QHh6O+Ph49OrVK8MdK1y4MBYsWIA2bdqgffv2+PLLL13rId1zzz2YNWsWHnjgAaxYsQI33ngjLl68iB07dmDWrFlYsmSJlRwqPSIjIzFmzBjs27cPNWvWxMyZM7Fp0yZMnTrVhKcNGjQIU6ZMQf/+/bFhwwZUqVIFH3/8MVatWoVXXnnFaF86d+6M1q1b41//+hf27duHa6+9Fp999hnmzp2LYcOGWSHWMTExWLZsGcaPH4/IyEhUrVo1X5R7eP/99zFx4kR069YN0dHRSEpKwltvvYVixYqhQ4cOWXrvwoULo06dOpg5cyZq1qyJUqVKoV69eqy3dRlw/HI3ixYtwo4dO3DhwgUcOnQIy5cvx9KlSxEVFYV58+YhNDTU8/OxsbEYPHgwXnzxRWzatAm33HILChUqhF27dmH27Nl49dVX0aNHj4Dmwf3334/jx4+jTZs2qFixIvbv34/XX38dDRs2zJaMtXkVrkHB5YY5de7c2QkNDXXOnj3r2qZ///5OoUKFnKNHj5rwr5dffjlNO6jwLRl+ncrRo0edOnXqOOXKlXN27drlOE7a8GvH+SsMesyYMU7dunWdkJAQp2TJkk5MTIwzevRo59SpU57fKTY21qlbt66zfv16p3nz5k5oaKgTFRXlvPHGG2naHjp0yLn33nudMmXKOMHBwU79+vWdadOmpWmXlJTk/O1vf3MiIyOdQoUKOTVq1HBefvllJyUlxWq3Y8cO56abbnIKFy7sAPB1KPblhA5u3LjR6d27t1O5cmUnJCTEiYiIcDp16uSsX7/etLmcueMWOjhkyJB077969WonJibGCQ4OzlVhhDkJx8//pIZfp/4XHBzslCtXzrn55pudV1991aSISCW9d65k6tSpTkxMjFO4cGGnaNGiTv369Z3hw4c7v/76q+M4gc2Djz/+2LnllluciIgIJzg42KlcubIzePBg57fffsuah+BjuAYzRpDjBODtQwghhBCSC7ni6teEEEIIITkFNzKEEEII8S3cyBBCCCHEt3AjQwghhBDfwo0MIYQQQnwLNzKEEEII8S3cyBBCCCHEt2So1hLJn8iUQxmttbF9+3YjDx061MipBUdTue6664wsK6AXLGhP2W3bthl5zpw5Rq5WrZrVbvjw4UYuUaLEZfY6/6Irx7/33ntG7tu3r5HLlSt3xffatGmTkVPrkqVy++23Gzk10zZxJzEx0chffvmldW7u3LlGLlWqlJHvueceq931119vZDken3zyidVu2bJlRpa16vr06WO1GzRoUEB9JznHr7/+auTIyMgc7MnlQY0MIYQQQnwLM/sSi4xoXb777jvrWBbV1P96k+XkZan533//3Wp3/PjxgO4tqVmzppFldXLA/hel1B7oKsCPPfaYkevXr3/ZfcgLyHGZMWOGde6VV14xstSUhYeHW+3kOalBkdcG7OJ2P//8s5G7du1qtWvevLmR77jjDq/u5xsWLVpk5AkTJljnZIXk5ORk65yss3T69GkjS+0mABw6dMjIVapUMbLWipYvX97IxYsXN7IuXPjLL78YuV27dkZ+7bXXQGzatGlj5BMnTljnypQpY2RZKFmOkRdS6wIArVu3NrJ8D1euXNlqt2TJEiNLzVtugBoZQgghhPgWbmQIIYQQ4lu4kSGEEEKIb6GPDAkYaU+XESubN2+22skpVaRIEeuctN1LW7v0nQGACxcuGPnUqVNGvvrqq6128nOB+vT88ccfRta+OdKfoEWLFta5Dz/8MKDr5yVmz55tHcvxe/75542s7e7Sv0L6SuiIsaJFixpZ+k3cddddVjvpW6P9Z/ITe/bsMfKoUaOMHBERYbWT8zolJcU6J/3H5BqUPkoaubb0Wi1WrJiRpT+U9qUpXbq0kaW/jJ4T48aNc+1HfqFVq1ZGlmMO2OtJjrN+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EBwcjISEBPP3Dz/8EDExMShcuDBKlSqFO++8Ez///LP12VatWqFevXrYsGEDbrrpJlx99dV48sknL3lPv8I16E8CXZfTpk1DmzZtEBERgZCQENSpUweTJk1K85kqVaqgU6dOWLlyJZo0aYLQ0FBUq1YNH3zwQZq227ZtQ5s2bVC4cGFUrFgRzz33HFJSUtK0mzt3Ljp27IjIyEiEhIQgOjoazz77rDWe+RmOYeaRoxuZPXv2AABKly6d6dceNWoUhgwZgsjISIwbNw633347pkyZgltuuQV//vknAKBXr144e/Ys/ve//1mfPXfuHObPn48ePXqgQIECAIDp06ejY8eOKFKkCMaMGYOnnnoKP/zwA1q0aJHGOerChQuIi4tDREQExo4di9tvvz3Tv192ERUVhQ0bNuD777+/ZNuVK1fioYcewp133omXXnoJf/zxB26//XYcO3bMtDl06BCaNWuGZcuWYejQoXj11VdRvXp13HfffXjllVdMu9OnT+Ptt99Gq1atMGbMGIwaNQpHjhxBXFwcNm3a5NqHixcvon///vjggw8wZ84cdO/eHcBf//rp27cvatSogfHjx2PYsGH4/PPPcdNNN1k/rABw7NgxtG/fHg0bNsQrr7yC1q1bX9Yz8xNcg/4k0HU5adIkREVF4cknn8S4ceNQqVIlPPTQQ3jzzTfTtN29ezd69OiBm2++GePGjUPJkiXRv39/a6N48OBBtG7dGps2bcKIESMwbNgwfPDBB3j11VfTXO+9995DkSJF8Pe//x2vvvoqYmJi8PTTT2PEiBFX/gDyABzDTMTJBqZNm+YAcJYtW+YcOXLE+fnnn50ZM2Y4pUuXdgoXLuz88ssvTmxsrBMbG5vms/369XOioqKsvwFwRo4cmeb6iYmJjuM4zuHDh53g4GDnlltucS5evGjavfHGGw4A591333Ucx3FSUlKcChUqOLfffrt1/VmzZjkAnK+++spxHMdJSkpySpQo4QwcONBqd/DgQad48eLW3/v16+cAcEaMGHG5jylX8tlnnzkFChRwChQo4DRv3twZPny4s2TJEic5OdlqB8AJDg52du/ebf62efNmB4Dz+uuvm7/dd999Tvny5Z2jR49an7/zzjud4sWLO+fOnXMcx3EuXLjgnD9/3mpz4sQJp2zZss6AAQPM3xITEx0Azssvv+z8+eefTq9e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eDhatWqFM2fOuLY7f/48Ro4cierVqyMkJASVKlXC8OHDcf78+YC/z4YNG3DDDTeY+TB58uQ0bQ4fPoz77rsPZcuWRWhoKK699lq8//77adqdPXsWjz32GCpVqoSQkBBcc801GDt2LBzHMW2CgoJw9uxZvP/++2Yu9O/fP+D+5hR79uxB3bp107xYASAiIsLI06ZNQ5s2bRAREYGQkBDUqVMHkyZNSvOZKlWqoFOnTli5ciWaNGmC0NBQVKtWDR988EGattu2bUObNm1QuHBhVKxYEc899xxSUlLStJs7dy46duyIyMhIhISEIDo6Gs8++ywuXrx4ZV8+D8Dx8w+BjlXq782nn36KevXqISQkBHXr1sXixYvTfO7AgQMYMGAAypYta9q9++67Vpvk5GQ8/fTTiImJQfHixREWFoaWLVtixYoVl+yz4zgYNGgQgoODkZCQYP7+4YcfIiYmBoULF0apUqVw55134ueff7Y+m+qvuGHDBtx00024+uqr8eSTT17ynldCjmpkroTDhw/jlltuQXh4OEaMGIESJUpg37591kNP5aOPPkJSUhIGDx6MoKAgvPTSS+jevTv27t2LQoUKed5n+fLlmDVrFoYOHYoyZcrg2muvxaRJk/Dggw+iW7du6N69OwCgQYMGWfI9s5r4+Hh0794dwcHB6N27NyZNmoR169ahcePGadpm5DmuW7cOcXFxaNSoEebOnYvChQun2y4lJQVdunTBypUrMWjQINSuXRtbt27FhAkTsHPnzoB8UE6cOIEOHTqgZ8+e6N27N2bNmoUHH3wQwcHBZoP7+++/o1WrVti9ezeGDh2KqlWrYvbs2ejfvz9OnjyJRx99FMBfC7lLly5YsWIF7rvvPjRs2BBLlizB448/jgMHDmDChAkA/jKP3n///WjSpAkGDRoEAIiOjr5kX3OaqKgorFmzBt9//72nk/SkSZNQt25ddOnSBQULFsT8+fPx0EMPISUlBUOGDLHa7t69Gz169MB9992Hfv364d1330X//v0RExODunXrAgAOHjyI1q1b48KFCxgxYgTCwsIwderUdOfFe++9hyJFiuDvf/87ihQpguXLl+Ppp5/G6dOn8fLLL2fuA/EZHD//EOhYAcDKlSuRkJCAhx56CEWLFsVrr72G22+/HT/99BNKly4NADh06BCaNWtmNj7h4eFYtGgR7rvv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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 56
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T09:34:05.055149Z",
     "start_time": "2025-03-05T09:34:05.051143Z"
    }
   },
   "source": [
    "# 从数据集到dataloader\n",
    "train_loader = torch.utils.data.DataLoader(train_ds, batch_size=32,\n",
    "                                           shuffle=True)  #batch_size分批，shuffle洗牌：打乱数据，让模型训练更稳定，避免陷入局部最优解\n",
    "val_loader = torch.utils.data.DataLoader(test_ds, batch_size=32, shuffle=False)"
   ],
   "outputs": [],
   "execution_count": 57
  },
  {
   "cell_type": "markdown",
   "source": [
    "在PyTorch中，`DataLoader`是一个迭代器，它封装了数据的加载和预处理过程，使得在训练机器学习模型时可以方便地批量加载数据。`DataLoader`主要负责以下几个方面：\n",
    "\n",
    "1. **批量加载数据**：`DataLoader`可以将数据集（Dataset）切分为更小的批次（batch），每次迭代提供一小批量数据，而不是单个数据点。这有助于模型学习数据中的统计依赖性，并且可以更高效地利用GPU等硬件的并行计算能力。\n",
    "\n",
    "2. **数据打乱**：默认情况下，`DataLoader`会在每个epoch（训练周期）开始时打乱数据的顺序。这有助于模型训练时避免陷入局部最优解，并且可以提高模型的泛化能力。\n",
    "\n",
    "3. **多线程数据加载**：`DataLoader`支持多线程（通过参数`num_workers`）来并行地加载数据，这可以显著减少训练过程中的等待时间，尤其是在处理大规模数据集时。cpu把数据加载到内存中，多线程会加载得更快gpu把数据加载到显存中，gpu的并行计算能力可以加速数据处理。\n",
    "\n",
    "4. **数据预处理**：`DataLoader`可以与`transforms`结合使用，对加载的数据进行预处理，如归一化、标准化、数据增强等操作。\n",
    "\n",
    "5. **内存管理**：`DataLoader`负责管理数据的内存使用，确保在训练过程中不会耗尽内存资源。\n",
    "\n",
    "6. **易用性**：`DataLoader`提供了一个简单的接口，可以很容易地集成到训练循环中。\n",
    "\n"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T09:34:05.065073Z",
     "start_time": "2025-03-05T09:34:05.055149Z"
    }
   },
   "cell_type": "code",
   "source": [
    "for datas, labels in train_loader:\n",
    "    print(datas.shape)  # [batch size, 1, 28, 28]所有深度学习的第一维都是batch size\n",
    "    print(labels.shape)\n",
    "    break\n",
    "#查看val_loader\n",
    "for datas, labels in val_loader:\n",
    "    print(datas.shape)\n",
    "    print(labels.shape)\n",
    "    break"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n"
     ]
    }
   ],
   "execution_count": 58
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 定义模型"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T09:34:05.070207Z",
     "start_time": "2025-03-05T09:34:05.066076Z"
    }
   },
   "source": [
    "# 搭建模型 深度学习搭建模型一半都会继承nn.Module类\n",
    "class NeuralNetwork(nn.Module):  # 继承nn.Module类：神经网络模型\n",
    "    def __init__(self):\n",
    "        super().__init__()  # 继承父类的初始化方法，子类有父类的属性\n",
    "        self.flatten = nn.Flatten()  # 展平层\n",
    "        self.linear_relu_stack = nn.Sequential(\n",
    "            nn.Linear(784, 300),  # in_features=784, out_features=300, 784是输入特征数，300是输出特征数 # 做类似线性回归的处理\n",
    "            nn.ReLU(),  # 激活函数，\n",
    "            nn.Linear(300, 100),  #隐藏层神经元数100\n",
    "            nn.ReLU(),  # 激活函数\n",
    "            nn.Linear(100, 10),  #输出层神经元数10 ，softmax不在这里，在后面的损失函数中\n",
    "        )  # 线性层linear_relu_stack:意味着有3层线性层，激活函数: ReLU\n",
    "\n",
    "    def forward(self, x):  # 前向计算，前向传播固定名字，forward前向计算固定名字\n",
    "        # x.shape [batch size, 1, 28, 28],1是通道数\n",
    "        x = self.flatten(x)\n",
    "        # print(f'x.shape--{x.shape}')\n",
    "        # 展平后 x.shape [batch size, 784]\n",
    "        logits = self.linear_relu_stack(x)\n",
    "        # logits.shape [batch size, 10]\n",
    "        return logits  #没有经过softmax,称为logits\n",
    "\n",
    "\n",
    "model = NeuralNetwork()  # 实例化模型"
   ],
   "outputs": [],
   "execution_count": 59
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T09:34:05.077324Z",
     "start_time": "2025-03-05T09:34:05.070207Z"
    }
   },
   "source": [
    "# 看看网络结构\n",
    "model  # 父类nn.Module中重写了__str__方法，所以可以直接打印模型，打印出模型的结构 "
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "NeuralNetwork(\n",
       "  (flatten): Flatten(start_dim=1, end_dim=-1)\n",
       "  (linear_relu_stack): Sequential(\n",
       "    (0): Linear(in_features=784, out_features=300, bias=True)\n",
       "    (1): ReLU()\n",
       "    (2): Linear(in_features=300, out_features=100, bias=True)\n",
       "    (3): ReLU()\n",
       "    (4): Linear(in_features=100, out_features=10, bias=True)\n",
       "  )\n",
       ")"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 60
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T09:34:05.083658Z",
     "start_time": "2025-03-05T09:34:05.077324Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#为了查看模型运算的tensor尺寸\n",
    "x = torch.randn(32, 1, 28, 28)\n",
    "print(x.shape)\n",
    "logits = model(x)  # 继承的nn.Module类，可以直接调用forward方法，实际是重写了__call__方法，所以可以直接调用，前向传播，前向计算，模型验证等等\n",
    "print(logits.shape)"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32, 10])\n"
     ]
    }
   ],
   "execution_count": 61
  },
  {
   "cell_type": "code",
   "source": "784 * 300 + 300 + 300 * 100 + 100 + 100 * 10 + 10",
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-05T09:34:05.088736Z",
     "start_time": "2025-03-05T09:34:05.083658Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "266610"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 62
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T09:34:05.094380Z",
     "start_time": "2025-03-05T09:34:05.088736Z"
    }
   },
   "source": [
    "for name, param in model.named_parameters():  # 打印模型参数\n",
    "    print(name, param.shape)"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "linear_relu_stack.0.weight torch.Size([300, 784])\n",
      "linear_relu_stack.0.bias torch.Size([300])\n",
      "linear_relu_stack.2.weight torch.Size([100, 300])\n",
      "linear_relu_stack.2.bias torch.Size([100])\n",
      "linear_relu_stack.4.weight torch.Size([10, 100])\n",
      "linear_relu_stack.4.bias torch.Size([10])\n"
     ]
    }
   ],
   "execution_count": 63
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T09:34:05.107887Z",
     "start_time": "2025-03-05T09:34:05.094380Z"
    }
   },
   "source": [
    "# 看看模型参数\n",
    "list(model.parameters())  # 这种方法拿到模型的所有可学习参数,requires_grad=True\n"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Parameter containing:\n",
       " tensor([[ 0.0279,  0.0166, -0.0017,  ...,  0.0355, -0.0352,  0.0309],\n",
       "         [-0.0140,  0.0274,  0.0289,  ..., -0.0131,  0.0185,  0.0025],\n",
       "         [ 0.0202, -0.0301, -0.0134,  ...,  0.0086, -0.0231,  0.0348],\n",
       "         ...,\n",
       "         [-0.0209, -0.0206, -0.0166,  ..., -0.0163, -0.0068, -0.0123],\n",
       "         [-0.0314,  0.0012,  0.0180,  ..., -0.0220, -0.0300, -0.0329],\n",
       "         [ 0.0002,  0.0347,  0.0282,  ...,  0.0175,  0.0245, -0.0080]],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([ 3.2439e-02,  6.9612e-03, -2.9709e-02, -1.6164e-02,  3.2396e-02,\n",
       "         -3.4003e-02,  3.4055e-02,  2.9651e-02, -1.4294e-02, -3.1930e-02,\n",
       "          1.3287e-02,  2.0443e-02,  1.3249e-02, -1.8802e-03,  6.1949e-03,\n",
       "          2.8029e-02, -2.0293e-02,  1.2769e-02, -2.1936e-02, -1.9684e-02,\n",
       "          2.7813e-02,  7.1748e-03, -3.5286e-03, -1.1053e-02,  2.0907e-02,\n",
       "         -6.2578e-03, -1.1026e-02,  1.9614e-03, -3.3540e-02,  1.0612e-02,\n",
       "          1.7508e-03,  1.0585e-02, -2.0349e-02, -1.4006e-02,  9.7001e-03,\n",
       "          2.7695e-02, -2.2790e-02, -3.1393e-02,  1.9996e-03, -3.4806e-02,\n",
       "         -1.5297e-02,  1.6981e-02, -1.1137e-03,  2.8923e-02,  3.2689e-02,\n",
       "          1.3105e-02,  4.8320e-04,  3.4692e-02,  3.0149e-02,  4.5786e-03,\n",
       "         -1.3775e-02, -9.0398e-03, -8.5716e-03,  3.5369e-03,  3.6571e-03,\n",
       "         -2.1675e-02,  3.2947e-02,  2.2326e-02, -1.9892e-02, -3.1714e-02,\n",
       "         -2.0845e-02,  1.8159e-02,  2.9957e-03, -3.2544e-02, -1.6531e-02,\n",
       "          2.1179e-02, -1.2729e-02, -1.0278e-02,  5.0136e-03,  2.5180e-02,\n",
       "          3.3432e-02,  1.5995e-02,  5.3415e-03, -1.2290e-02,  3.3785e-02,\n",
       "         -4.9721e-03, -3.5162e-02, -3.1617e-02,  2.8786e-03, -7.1396e-03,\n",
       "         -2.9488e-02,  9.3305e-03,  3.1521e-02,  2.5265e-02,  2.1461e-02,\n",
       "         -1.0799e-02,  2.4717e-02, -1.3854e-02,  1.4680e-02, -2.3107e-02,\n",
       "         -2.2382e-02, -2.6175e-02,  2.6908e-02, -1.4621e-02, -3.3220e-02,\n",
       "          1.0017e-03, -1.5420e-02,  4.2782e-04, -1.3465e-02, -2.2757e-02,\n",
       "         -4.7278e-05, -1.7272e-02, -7.1275e-04, -1.4023e-02, -3.0403e-02,\n",
       "          1.6379e-02, -3.0961e-02,  2.4405e-02,  9.1792e-03,  8.8440e-03,\n",
       "          1.0580e-02, -2.3844e-02, -2.9629e-02,  1.4076e-02,  2.1778e-02,\n",
       "         -3.3755e-02,  3.0360e-02,  1.7157e-02,  1.5406e-02,  2.5792e-02,\n",
       "         -3.1520e-02,  1.8456e-02, -1.3485e-02,  2.6096e-03, -3.3929e-02,\n",
       "         -2.8623e-02,  1.4090e-02,  3.4603e-02,  1.1623e-02, -1.0407e-02,\n",
       "          3.5635e-02, -2.5741e-02,  3.4848e-02,  2.7998e-02,  3.0093e-03,\n",
       "          2.1345e-02,  1.0209e-02, -3.5292e-02, -1.9221e-02, -9.9753e-03,\n",
       "          2.3943e-02,  7.7290e-03,  2.2155e-03, -3.3139e-04, -2.5438e-02,\n",
       "          3.3231e-02,  1.1985e-02,  3.5948e-04,  1.3557e-02,  3.0817e-02,\n",
       "         -1.1557e-02, -5.7551e-03, -2.5466e-02, -2.1961e-02, -1.3387e-02,\n",
       "          1.7870e-02, -2.6915e-02,  3.5298e-02,  7.0228e-03,  2.8543e-03,\n",
       "          7.0336e-03,  2.9762e-03, -5.8211e-03,  2.8283e-02,  3.2272e-02,\n",
       "         -1.5120e-02, -1.0820e-02, -2.1352e-02,  3.4125e-02, -1.4866e-03,\n",
       "         -2.9869e-02, -2.8555e-02, -2.5273e-02, -1.2725e-03,  3.1050e-02,\n",
       "         -6.0096e-03,  2.9616e-02,  1.8159e-03, -2.2781e-02,  3.1230e-02,\n",
       "          2.6124e-02, -3.2731e-02, -2.7840e-02,  2.6481e-02, -5.6730e-03,\n",
       "          2.7989e-02,  8.2917e-03,  1.2989e-03, -1.3409e-03,  6.3401e-03,\n",
       "          1.7197e-02,  4.8574e-03,  1.7654e-02,  1.7823e-02, -2.5929e-02,\n",
       "         -2.1372e-02, -9.4946e-03,  2.0178e-02, -1.3573e-02, -1.1213e-02,\n",
       "          1.6389e-02,  1.0743e-02, -8.2712e-04,  2.5006e-02,  1.2543e-03,\n",
       "          2.2027e-02, -1.6707e-02,  3.4961e-02,  4.2840e-03,  1.8845e-02,\n",
       "         -2.9507e-02,  1.9460e-02, -1.4397e-02, -7.0323e-03,  2.9837e-02,\n",
       "         -1.6431e-02, -1.6975e-02, -8.3654e-03,  1.6277e-02, -5.9175e-03,\n",
       "         -3.4343e-02, -9.0251e-03, -2.7228e-02, -8.3905e-04, -3.1839e-02,\n",
       "          2.8199e-02,  1.8178e-02, -1.4026e-02, -2.5880e-02, -1.6550e-02,\n",
       "         -1.2224e-02,  3.1156e-02,  2.3093e-02,  3.1800e-02,  1.0700e-02,\n",
       "          1.6437e-02,  2.9798e-02,  1.9957e-02, -1.9994e-02,  1.4528e-02,\n",
       "          3.5485e-02, -1.3232e-02, -9.7032e-03,  3.1913e-02,  1.1500e-02,\n",
       "          1.4849e-02,  9.2718e-03, -3.1625e-02, -1.5252e-02, -8.6875e-03,\n",
       "          1.1895e-02, -1.4419e-02,  2.2312e-02,  2.2160e-03, -1.1810e-02,\n",
       "          5.5418e-03, -3.1208e-02, -2.1443e-02, -1.9359e-02, -2.3644e-03,\n",
       "          1.2914e-02, -2.3386e-02, -1.1207e-02, -3.5401e-02, -2.5524e-02,\n",
       "         -3.1687e-02, -1.3625e-02, -1.1796e-02, -2.1860e-02, -2.2178e-02,\n",
       "          3.4134e-02,  1.8431e-02,  2.5968e-02, -1.7528e-02,  3.3239e-02,\n",
       "         -9.8883e-03, -2.5387e-02,  4.9192e-03,  9.6516e-03, -1.5326e-02,\n",
       "         -1.2952e-02, -1.8732e-02, -2.0437e-02,  1.0712e-02, -1.4845e-02,\n",
       "          3.1372e-03, -1.5750e-02, -2.4075e-02,  3.3558e-02, -7.3107e-03,\n",
       "         -2.9844e-02,  1.3481e-02,  1.7190e-02,  1.1411e-02, -8.0340e-04,\n",
       "          3.4723e-02,  7.0876e-03,  3.5903e-03,  3.0169e-02, -1.2625e-02],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([[ 0.0525, -0.0243,  0.0558,  ...,  0.0239, -0.0426,  0.0159],\n",
       "         [ 0.0257, -0.0424, -0.0291,  ...,  0.0020,  0.0354,  0.0228],\n",
       "         [-0.0020, -0.0026, -0.0420,  ..., -0.0040, -0.0303,  0.0405],\n",
       "         ...,\n",
       "         [ 0.0092, -0.0565, -0.0413,  ...,  0.0386, -0.0335,  0.0153],\n",
       "         [-0.0312,  0.0008,  0.0020,  ...,  0.0567, -0.0499, -0.0429],\n",
       "         [-0.0192,  0.0180,  0.0554,  ..., -0.0158, -0.0328, -0.0128]],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([-0.0114,  0.0200,  0.0243, -0.0073, -0.0095,  0.0013,  0.0025,  0.0318,\n",
       "          0.0300,  0.0242,  0.0053, -0.0532,  0.0395,  0.0321,  0.0395, -0.0546,\n",
       "         -0.0037, -0.0095,  0.0083,  0.0110,  0.0502, -0.0551,  0.0245,  0.0174,\n",
       "          0.0213,  0.0011, -0.0080,  0.0048, -0.0169, -0.0314,  0.0322, -0.0098,\n",
       "         -0.0364,  0.0438,  0.0395,  0.0500,  0.0002,  0.0413,  0.0405, -0.0490,\n",
       "          0.0193,  0.0449, -0.0431, -0.0152,  0.0235, -0.0391, -0.0545,  0.0362,\n",
       "         -0.0373, -0.0487, -0.0118,  0.0300,  0.0165,  0.0532,  0.0266, -0.0305,\n",
       "         -0.0145, -0.0471, -0.0252,  0.0494, -0.0491, -0.0411,  0.0406, -0.0022,\n",
       "         -0.0445,  0.0565,  0.0043, -0.0326, -0.0097,  0.0184, -0.0408, -0.0163,\n",
       "          0.0368, -0.0046,  0.0265,  0.0001,  0.0036, -0.0553,  0.0225, -0.0437,\n",
       "         -0.0510, -0.0318,  0.0008, -0.0207, -0.0481, -0.0253, -0.0009, -0.0126,\n",
       "         -0.0394,  0.0034,  0.0509, -0.0559,  0.0060, -0.0141,  0.0086, -0.0115,\n",
       "          0.0014, -0.0183, -0.0293,  0.0082], requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([[-8.4042e-02, -7.5048e-02,  1.0334e-02, -4.7391e-02, -8.2634e-02,\n",
       "          -7.5843e-02,  8.7613e-02,  6.2215e-03, -3.2100e-02, -4.8433e-02,\n",
       "          -9.9792e-02, -8.4172e-03,  8.8367e-02, -4.1262e-02,  1.7823e-03,\n",
       "           9.6023e-02,  1.0664e-02, -5.2221e-02, -8.2930e-02, -9.7408e-02,\n",
       "           9.0481e-02, -4.7348e-02,  9.2230e-02, -1.2538e-02, -1.8762e-02,\n",
       "          -5.0986e-02,  9.2460e-02,  8.5549e-02, -3.2435e-02, -8.0177e-02,\n",
       "           2.3171e-05, -3.4035e-02,  9.2671e-02, -4.5710e-02,  7.6631e-02,\n",
       "          -9.9421e-02, -6.7393e-02,  4.0414e-02, -8.5306e-02,  3.9947e-02,\n",
       "          -8.7109e-02, -9.7976e-02,  7.5770e-03,  3.1877e-02,  7.0289e-02,\n",
       "           1.2972e-02, -6.8604e-02,  5.9561e-02, -6.6670e-02,  6.4380e-02,\n",
       "           8.5710e-02,  3.0696e-02,  2.7862e-03,  6.0823e-02,  5.1032e-02,\n",
       "           2.4776e-02,  1.9200e-02, -9.7120e-02, -6.6733e-02,  1.3335e-02,\n",
       "          -8.2532e-02, -7.4789e-02,  3.3437e-02, -1.9444e-02,  8.6953e-02,\n",
       "           6.5721e-02, -9.9783e-02,  9.3316e-02,  4.5038e-02, -8.0294e-02,\n",
       "           1.3770e-02,  5.0765e-03, -1.5610e-02,  3.0804e-02, -8.6394e-02,\n",
       "          -9.5450e-02, -4.7102e-02, -4.7379e-02,  7.4298e-02,  9.8694e-02,\n",
       "           6.3343e-02, -1.5113e-02, -1.6953e-02,  6.7091e-02, -5.0543e-02,\n",
       "          -9.9763e-02, -7.3638e-02, -5.2836e-02,  7.5460e-03, -2.3160e-02,\n",
       "           7.6454e-02, -9.7731e-02,  5.8635e-02, -9.9829e-02, -3.5201e-02,\n",
       "          -4.1111e-02,  5.1711e-02, -8.8247e-02, -4.9791e-02, -2.5919e-02],\n",
       "         [-5.9592e-02,  9.3681e-02, -2.5731e-02,  7.5154e-02, -4.2444e-02,\n",
       "           3.6011e-02, -3.1409e-03,  8.8204e-02,  7.7462e-02,  5.0479e-02,\n",
       "          -1.3945e-02, -5.7299e-02,  3.0435e-02, -7.8065e-02,  4.6567e-02,\n",
       "           5.9113e-02, -3.2730e-02,  6.6080e-02, -9.5942e-02,  3.6803e-02,\n",
       "           3.2760e-02,  7.4680e-02,  6.0970e-02, -9.9093e-02, -5.7003e-02,\n",
       "           6.1156e-02, -9.8239e-02, -4.4900e-02,  9.7202e-02, -3.5807e-02,\n",
       "           9.8220e-02,  1.0293e-02,  4.7127e-03,  5.6127e-02,  7.0157e-02,\n",
       "          -1.2124e-02, -7.6133e-02,  3.0528e-02,  7.6567e-02,  7.7006e-02,\n",
       "           8.5395e-02,  1.5102e-02,  7.9761e-02, -6.0187e-03,  6.0676e-02,\n",
       "          -4.8641e-02, -2.1448e-04,  3.9524e-02,  1.4531e-02, -1.8096e-02,\n",
       "           3.2271e-02,  4.5536e-02, -4.8238e-02, -6.8833e-02,  3.1801e-02,\n",
       "           2.8845e-02, -3.6962e-02, -7.4678e-02, -8.5011e-02, -6.7854e-03,\n",
       "           1.3630e-03,  9.6503e-02,  2.4610e-02,  3.3762e-02,  5.6078e-02,\n",
       "          -5.3029e-02, -8.7178e-02,  9.9216e-02,  5.0597e-02,  4.4023e-03,\n",
       "           8.6999e-02, -2.8768e-02, -7.5234e-02,  7.8175e-02,  4.1623e-02,\n",
       "          -8.2517e-02,  3.2120e-02,  6.6160e-02,  4.3573e-02,  6.2849e-02,\n",
       "          -3.4811e-02, -6.4496e-02,  2.0334e-02, -6.3511e-02,  8.9426e-02,\n",
       "           1.0815e-02,  9.6935e-02,  5.1249e-02, -6.5116e-02, -2.7640e-02,\n",
       "          -3.8875e-02,  6.0074e-03, -5.7266e-02, -5.8118e-02,  7.0073e-02,\n",
       "           6.2621e-02,  2.0083e-02, -1.9815e-02, -1.6801e-02, -4.4547e-02],\n",
       "         [-4.4891e-02,  5.4881e-02, -1.9678e-02, -1.2974e-02, -6.6749e-03,\n",
       "           1.2530e-02, -2.5109e-02,  4.6249e-02,  1.2996e-02,  1.4498e-02,\n",
       "           5.8081e-02,  4.3657e-02,  2.6008e-02, -4.1770e-02,  8.8275e-02,\n",
       "          -1.1641e-02, -5.0220e-02, -4.0168e-02,  3.1902e-03,  4.9734e-02,\n",
       "           6.6561e-02, -2.4079e-02, -5.6666e-02, -5.2550e-02,  2.4038e-02,\n",
       "           7.0446e-02,  1.3400e-02,  7.6953e-02, -1.1725e-02,  6.2568e-02,\n",
       "           6.9770e-02, -6.4845e-02,  5.3293e-02,  7.5724e-03,  5.2556e-02,\n",
       "           6.2275e-03,  1.9010e-02, -1.2671e-02, -7.9599e-02,  6.8327e-02,\n",
       "          -3.7598e-02, -8.5050e-02, -7.9659e-03,  1.8552e-02, -9.3362e-02,\n",
       "          -4.0362e-02,  8.4199e-02,  4.5865e-02, -9.5368e-03, -5.3570e-03,\n",
       "          -4.8846e-02,  5.9745e-02, -4.1716e-02,  3.0737e-02,  4.9626e-03,\n",
       "          -6.7068e-02, -2.6464e-02, -6.7428e-02,  4.8871e-03,  6.1645e-02,\n",
       "           9.5829e-02, -9.5172e-02,  1.7933e-02, -8.3574e-02,  5.9222e-02,\n",
       "           4.7593e-03, -5.2169e-03,  2.6217e-02, -3.1036e-02,  5.1405e-02,\n",
       "           6.3260e-02,  3.8223e-02, -3.1729e-02, -5.5724e-03,  3.6049e-02,\n",
       "           8.2170e-02,  2.7651e-02,  4.3478e-02, -2.2573e-02,  5.8097e-02,\n",
       "          -8.6955e-02, -6.7744e-02,  7.1345e-02, -7.1597e-02, -9.6042e-02,\n",
       "           6.1725e-02, -1.3611e-02,  7.3224e-03,  5.4207e-02, -7.9833e-02,\n",
       "          -8.9785e-02, -4.0090e-02,  2.1242e-02,  7.4065e-02, -9.0860e-02,\n",
       "           8.1885e-02, -8.0251e-02,  7.1131e-02, -3.9650e-02, -1.8207e-02],\n",
       "         [-9.5717e-03, -3.3760e-02,  4.2972e-02, -7.6486e-03, -5.1913e-02,\n",
       "          -1.5019e-02, -8.7376e-02, -2.6811e-02, -2.6098e-02,  6.3263e-02,\n",
       "           4.1810e-02,  5.3968e-02,  2.1253e-02,  9.1219e-02,  1.0433e-02,\n",
       "           3.4829e-02, -6.0759e-02,  5.6230e-02,  3.6598e-02, -6.0622e-02,\n",
       "           9.2626e-03,  6.4930e-03, -9.6965e-02, -2.7134e-02,  8.7541e-02,\n",
       "           3.4977e-03, -3.5505e-02, -8.3276e-02, -9.6754e-02,  8.8139e-02,\n",
       "          -1.5220e-02,  6.6533e-02, -9.4958e-02,  6.4246e-02, -6.0473e-02,\n",
       "          -9.2277e-02,  3.5587e-02, -6.2234e-03, -6.8917e-02,  9.5280e-02,\n",
       "           1.9488e-03,  7.8861e-02, -5.2119e-02, -1.0393e-02, -8.9127e-03,\n",
       "           5.7998e-02,  2.1787e-02, -8.0081e-02,  6.0622e-02,  1.1702e-02,\n",
       "           7.6782e-02,  8.9219e-02,  5.6503e-02, -3.3880e-02,  7.3679e-04,\n",
       "           6.3755e-02,  7.5344e-02,  3.8858e-02, -4.4606e-02, -8.0660e-03,\n",
       "          -5.7032e-02,  1.4701e-03, -5.4300e-02, -8.9061e-02,  3.0987e-02,\n",
       "          -7.5415e-02, -9.7604e-04, -7.4612e-02, -3.5038e-02,  7.1404e-02,\n",
       "           2.5068e-02, -8.5180e-02, -4.6880e-02, -8.7228e-02, -9.3724e-02,\n",
       "           4.0463e-02,  7.8407e-02, -1.2890e-02,  4.5800e-02, -9.4893e-03,\n",
       "          -5.2026e-02,  9.2769e-02,  9.9076e-02,  9.1609e-02,  1.7572e-02,\n",
       "           7.1484e-03,  1.3016e-05, -6.0941e-02, -1.8799e-02, -2.2353e-02,\n",
       "           7.0530e-02,  3.5883e-02,  8.8039e-02, -8.2393e-02,  8.2215e-02,\n",
       "           7.3711e-02, -9.3975e-02,  6.3387e-02,  1.5478e-02, -8.6595e-02],\n",
       "         [ 2.3371e-02,  7.7330e-02,  3.3296e-02, -2.0758e-02, -4.3099e-02,\n",
       "           9.5192e-03, -9.3402e-02,  2.9647e-02,  5.9865e-02, -6.1341e-02,\n",
       "           8.9152e-02, -8.9400e-02,  4.8421e-02,  9.3041e-02, -4.8926e-02,\n",
       "          -8.8284e-03,  8.3836e-02, -3.7484e-02, -6.4478e-02, -2.6341e-02,\n",
       "          -3.6222e-02, -2.4731e-02, -7.0240e-02,  2.5820e-02, -4.9745e-02,\n",
       "          -5.9864e-02, -4.4832e-02, -6.9690e-02, -8.1338e-02,  1.8572e-02,\n",
       "          -4.6381e-02,  3.4479e-02,  6.0018e-02, -6.4455e-02,  5.0299e-02,\n",
       "           9.6806e-02,  6.7055e-02, -2.9501e-02, -1.7548e-03, -7.2933e-02,\n",
       "          -8.7666e-02,  6.2380e-02,  9.5870e-02, -4.1066e-02,  2.2036e-02,\n",
       "           4.4483e-02, -1.1320e-03,  5.3291e-02,  8.5166e-02,  4.5362e-02,\n",
       "           1.2675e-02, -7.7646e-02, -2.7293e-02,  5.9433e-02,  7.4906e-02,\n",
       "           3.7892e-02, -5.0018e-02,  8.9047e-02,  6.5393e-02,  6.6710e-02,\n",
       "          -8.8936e-02,  5.2992e-02, -7.2530e-02, -1.0624e-02, -3.2466e-03,\n",
       "          -5.7796e-02,  6.7906e-02,  4.9901e-03, -2.6354e-02, -9.5532e-02,\n",
       "           1.7870e-02,  2.4087e-02, -7.9600e-02, -7.5908e-02, -8.8430e-02,\n",
       "           4.1093e-02,  2.6532e-02,  1.4881e-02,  2.3772e-02,  9.9580e-02,\n",
       "          -6.4808e-02, -5.6238e-02,  6.3118e-02, -7.1642e-02,  9.9824e-02,\n",
       "          -2.6913e-02,  5.4115e-02,  4.7647e-02,  4.8961e-02, -1.2196e-02,\n",
       "          -9.5505e-02, -8.5154e-02,  4.7352e-02,  1.6784e-02,  8.7852e-02,\n",
       "          -1.3749e-02, -1.3333e-03, -7.4893e-02, -8.2138e-02,  8.4136e-02],\n",
       "         [ 3.4831e-02, -9.6052e-02, -8.6167e-02,  4.5652e-02, -6.7725e-02,\n",
       "          -6.8624e-02,  5.2385e-02, -5.8005e-02, -7.8792e-02, -8.6200e-03,\n",
       "          -1.2958e-02,  3.3576e-02, -5.1630e-04,  9.7078e-02, -5.7697e-02,\n",
       "          -3.7522e-02, -4.2910e-02,  5.7926e-02, -3.2406e-02,  4.5268e-02,\n",
       "          -9.0578e-02, -9.7577e-02,  3.4250e-02,  4.3786e-02,  9.3736e-02,\n",
       "          -1.1301e-02, -3.9810e-02,  5.3054e-02,  1.5627e-02, -7.6552e-02,\n",
       "           3.9393e-02,  4.9465e-02,  3.3401e-02,  8.7728e-02,  3.1724e-03,\n",
       "          -8.7040e-02, -2.3726e-02,  7.9348e-02, -3.3177e-02,  5.7803e-02,\n",
       "          -4.6262e-02,  5.4586e-02, -1.0692e-02,  8.8708e-02, -6.0362e-02,\n",
       "           8.7290e-03,  3.0021e-03,  7.3717e-02,  1.2535e-02,  5.1926e-02,\n",
       "          -1.7061e-02, -6.9836e-02,  2.4552e-02, -9.9233e-02,  1.5332e-02,\n",
       "          -9.0306e-02,  3.5684e-02, -7.2104e-02, -8.9023e-02,  5.5202e-02,\n",
       "          -8.2962e-02, -7.9369e-02, -1.3104e-02,  5.0538e-02,  7.6959e-02,\n",
       "          -2.4746e-02, -8.4358e-03,  7.9785e-02,  9.0058e-02, -1.7300e-02,\n",
       "           1.5378e-02, -4.7878e-02,  3.8459e-02, -8.7662e-02,  8.8798e-02,\n",
       "           5.9821e-02,  1.8936e-02,  4.9073e-03,  1.7607e-02,  2.6041e-02,\n",
       "           8.3502e-02, -6.4612e-02, -8.6949e-02, -8.8352e-04, -2.1403e-02,\n",
       "           8.6798e-02,  8.5935e-02, -1.9714e-02, -6.6928e-03, -9.6324e-03,\n",
       "           5.2870e-02, -1.5345e-02,  6.7106e-02, -3.3271e-02,  2.6185e-02,\n",
       "           3.2207e-02,  3.2503e-02,  4.4218e-02,  8.8778e-02, -1.6079e-02],\n",
       "         [ 1.5007e-02, -6.7451e-02, -3.2259e-02,  5.6167e-02,  1.3319e-02,\n",
       "           1.2117e-02,  8.6562e-02,  3.7454e-02, -2.3807e-02, -4.7048e-02,\n",
       "           1.7415e-02,  3.4867e-02, -8.6536e-03,  1.2646e-02, -7.5658e-02,\n",
       "           6.5587e-02, -5.9811e-02,  7.0932e-02, -8.4885e-02,  5.2388e-02,\n",
       "          -7.9104e-02,  1.0568e-02,  5.4064e-02,  6.3706e-02, -3.5147e-02,\n",
       "           3.0832e-02, -5.5750e-02, -8.9260e-02, -4.2696e-02,  4.9477e-02,\n",
       "          -1.0549e-03, -9.3586e-02, -6.7073e-02,  4.7943e-02, -2.0091e-03,\n",
       "          -4.8999e-02, -2.1447e-02,  9.4863e-02, -3.1814e-02,  1.3281e-02,\n",
       "          -1.6169e-02,  3.2890e-02, -5.7830e-02,  7.4922e-02, -6.5245e-02,\n",
       "          -5.2246e-02,  5.3773e-02, -5.7225e-02,  7.8252e-02,  9.9109e-02,\n",
       "           8.4611e-02,  3.5620e-02,  7.2400e-02,  1.8290e-02, -5.4292e-02,\n",
       "          -8.4932e-02, -5.9149e-02,  2.5391e-02,  5.0793e-02,  9.6881e-02,\n",
       "           6.7477e-02,  2.8545e-02, -1.9444e-02,  4.8312e-02, -2.4615e-02,\n",
       "          -9.3124e-02, -6.0611e-02, -1.7559e-02, -8.7863e-02, -6.5503e-02,\n",
       "          -5.0926e-02,  1.6399e-02, -8.8616e-02, -3.8131e-02,  7.3140e-02,\n",
       "           4.7976e-02,  3.4184e-02,  1.9942e-03,  6.4811e-03,  8.3136e-02,\n",
       "          -7.3016e-07, -7.5572e-02,  7.2152e-02, -5.4006e-02,  2.0079e-02,\n",
       "          -9.4234e-02, -5.1094e-02,  3.4323e-02,  2.8944e-02, -1.0952e-02,\n",
       "           5.8970e-02,  6.7152e-03,  7.9607e-02,  1.5195e-02, -4.8155e-02,\n",
       "           9.7875e-02,  5.7050e-03,  2.8900e-02,  2.3584e-02,  8.2062e-02],\n",
       "         [-2.3980e-02,  7.8806e-02, -3.7501e-02,  1.9567e-02,  1.4485e-02,\n",
       "          -2.2358e-02, -9.7708e-02, -7.9842e-03, -2.2107e-02,  7.7227e-02,\n",
       "          -1.9227e-02, -2.0819e-02,  2.4799e-02,  1.6044e-02, -5.4072e-02,\n",
       "           1.4565e-02,  8.0798e-03, -7.2273e-02,  7.1491e-02,  6.5247e-02,\n",
       "          -5.5894e-02,  1.0623e-02,  8.7247e-02,  4.3232e-02,  4.0979e-02,\n",
       "           2.7828e-02, -7.9968e-02, -8.7465e-02, -7.1032e-02, -9.3810e-02,\n",
       "          -3.0955e-02, -2.4520e-02, -7.5252e-02,  9.4394e-02, -4.3437e-02,\n",
       "          -6.1489e-02,  6.1314e-02,  2.1625e-02,  6.6294e-02,  2.1364e-02,\n",
       "           4.0600e-02,  2.0239e-02,  3.9687e-02, -5.2031e-02, -8.9751e-02,\n",
       "           3.5595e-03,  8.0476e-02,  7.7634e-02,  9.8739e-02, -8.8733e-02,\n",
       "          -6.5021e-02,  1.1228e-02,  7.6463e-02, -5.6222e-03, -5.1617e-02,\n",
       "           2.0232e-02, -9.3402e-02, -2.2361e-02,  3.3828e-02,  6.5630e-02,\n",
       "           3.8707e-02, -3.2522e-02,  2.9272e-02, -7.8846e-02, -7.8992e-02,\n",
       "          -2.3139e-02, -5.1271e-02, -4.3504e-02,  8.6730e-02, -7.8788e-02,\n",
       "          -5.2907e-02,  2.5334e-03, -6.0960e-02,  2.6401e-02,  8.9150e-02,\n",
       "          -2.2006e-03,  8.3078e-02,  1.0507e-02, -1.3999e-02, -4.1344e-02,\n",
       "           2.6440e-02, -5.5476e-02,  7.7704e-03, -8.7504e-02,  6.1292e-02,\n",
       "          -2.4277e-02, -9.9975e-02, -8.9482e-02, -9.3959e-02, -6.8712e-02,\n",
       "           4.9934e-02, -8.4904e-02, -4.5923e-02, -4.0294e-02, -7.4427e-02,\n",
       "          -9.8340e-03, -8.1910e-02,  2.1523e-02,  1.6178e-02, -1.7987e-02],\n",
       "         [ 1.9356e-02,  3.3220e-02,  5.2657e-02,  2.1108e-02,  1.2525e-02,\n",
       "           8.3086e-02,  8.4428e-02, -9.4839e-03,  4.8892e-02, -9.2302e-02,\n",
       "          -5.8573e-02, -3.9243e-02, -3.4151e-02,  8.0504e-02, -2.6820e-02,\n",
       "          -9.0968e-02,  4.1599e-03,  6.6372e-02,  5.4896e-02,  7.4854e-02,\n",
       "          -9.7700e-03, -9.8891e-03,  9.7905e-02,  5.7846e-02, -7.1930e-02,\n",
       "          -5.2443e-02,  3.8117e-02, -9.8221e-02, -1.2494e-02,  8.9536e-02,\n",
       "          -7.1666e-02,  6.9640e-02,  8.6487e-02,  9.7575e-02,  9.9376e-02,\n",
       "           7.3505e-02,  8.4948e-02,  1.7652e-02,  3.1132e-02,  3.0051e-02,\n",
       "           3.6051e-02, -5.6466e-02,  4.1268e-02,  9.1604e-02,  9.7272e-02,\n",
       "          -6.6499e-02, -2.8752e-03, -1.4912e-02,  9.5019e-03,  6.9873e-02,\n",
       "          -9.8651e-02,  7.9791e-03, -7.5785e-03, -3.3506e-02, -8.6957e-02,\n",
       "          -4.2720e-02, -3.2318e-02,  8.4314e-02, -2.8284e-02, -4.7220e-02,\n",
       "          -4.4074e-02,  3.8337e-02, -6.7906e-02,  9.9767e-02,  4.1169e-02,\n",
       "          -7.5046e-02, -6.3562e-02,  4.1866e-03,  3.3955e-03, -4.0790e-02,\n",
       "           1.1496e-02,  5.6640e-02, -7.5857e-03,  1.0351e-02,  6.9331e-02,\n",
       "          -8.5424e-02,  2.6320e-02, -5.6768e-02, -7.7645e-02, -9.5898e-02,\n",
       "           1.9226e-02, -8.8740e-02,  2.1494e-02,  5.3579e-02,  8.8151e-02,\n",
       "          -6.2609e-02, -6.6354e-02, -2.7091e-02,  4.8218e-02,  7.4200e-02,\n",
       "          -8.2461e-02, -8.2721e-02, -4.1684e-02,  8.4205e-02,  1.1172e-02,\n",
       "          -5.2447e-02,  9.7772e-02, -7.0183e-02, -2.0513e-02, -3.1152e-02],\n",
       "         [-1.6747e-03, -2.0095e-02,  5.4704e-03, -9.2829e-02,  5.2499e-02,\n",
       "           5.3823e-02,  7.7926e-02,  4.4904e-02,  4.4961e-03, -1.9544e-02,\n",
       "           9.6750e-02,  3.6584e-02, -3.3317e-02,  4.1552e-02, -3.9757e-02,\n",
       "           9.9738e-02,  1.8489e-02,  5.8377e-02,  2.8495e-02,  7.6937e-02,\n",
       "          -1.7918e-02, -8.7085e-02,  6.5753e-02, -2.2149e-02, -8.7577e-02,\n",
       "           2.1952e-02, -3.6354e-02,  3.7811e-02,  4.3679e-03, -7.2694e-02,\n",
       "           1.1599e-02, -3.7924e-02, -7.7256e-02,  8.0550e-02,  5.9855e-02,\n",
       "           1.1928e-02, -7.7828e-03, -8.1985e-02, -5.4946e-02, -2.9743e-02,\n",
       "           5.1850e-03, -1.7945e-02,  1.7718e-02, -3.9981e-02, -8.5795e-02,\n",
       "           1.6382e-03, -7.7850e-02,  1.8497e-02, -9.5553e-02, -5.6259e-02,\n",
       "          -7.3148e-02,  1.9150e-02,  7.8885e-02, -3.1103e-02, -7.2793e-02,\n",
       "           9.8090e-02, -1.3963e-02, -1.2134e-03,  2.7451e-02, -2.2978e-02,\n",
       "           5.7261e-02,  4.8121e-02,  1.1819e-02,  7.5230e-02,  6.5353e-02,\n",
       "           6.6848e-02,  5.1715e-03, -6.6421e-02,  7.9737e-02,  2.1952e-02,\n",
       "          -2.0698e-02,  5.7003e-02,  1.5411e-02, -9.4743e-02,  9.9632e-02,\n",
       "          -4.9140e-02,  9.1479e-02,  3.7303e-02, -2.8291e-02,  2.0608e-02,\n",
       "           8.0240e-02,  4.8029e-02, -3.7528e-02, -9.4338e-03, -7.0866e-03,\n",
       "           9.7921e-02,  8.4742e-02,  4.7198e-03,  2.4692e-02,  5.3385e-02,\n",
       "           7.1402e-03, -2.9518e-04,  3.7895e-02,  5.6666e-02, -3.4615e-02,\n",
       "          -7.1655e-02, -6.7458e-02, -6.0435e-02,  2.2655e-02, -5.7616e-02]],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([ 0.0796,  0.0196,  0.0647, -0.0705,  0.0187,  0.0697, -0.0997,  0.0480,\n",
       "         -0.0452,  0.0960], requires_grad=True)]"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 64
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T09:34:05.110184Z",
     "start_time": "2025-03-05T09:34:05.107887Z"
    }
   },
   "source": [
    "# model.state_dict()  # 这种方法用于保存模型参数，看能看见参数属于模型的哪一部分"
   ],
   "outputs": [],
   "execution_count": 65
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练\n",
    "\n",
    "pytorch的训练需要自行实现，包括\n",
    "1. 定义损失函数\n",
    "2. 定义优化器\n",
    "3. 定义训练步\n",
    "4. 训练"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T09:34:05.116548Z",
     "start_time": "2025-03-05T09:34:05.110184Z"
    }
   },
   "source": [
    "# 1. 定义损失函数 采用交叉熵损失\n",
    "loss_fct = nn.CrossEntropyLoss()  #内部先做softmax，然后计算交叉熵\n",
    "# 2. 定义优化器 采用SGD\n",
    "# Optimizers specified in the torch.optim package,随机梯度下降\n",
    "optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)"
   ],
   "outputs": [],
   "execution_count": 66
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T09:34:05.122654Z",
     "start_time": "2025-03-05T09:34:05.116548Z"
    }
   },
   "cell_type": "code",
   "source": "10000 / 32",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "312.5"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 67
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T09:34:05.128522Z",
     "start_time": "2025-03-05T09:34:05.122654Z"
    }
   },
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "# \n",
    "@torch.no_grad()  # 装饰器，禁止反向传播，节省内存\n",
    "def evaluating(model, dataloader, loss_fct):\n",
    "    loss_list = []  # 记录损失\n",
    "    pred_list = []  # 记录预测\n",
    "    label_list = []  # 记录标签\n",
    "    for datas, labels in dataloader:  #10000/32=312\n",
    "        datas = datas.to(device)  # 转到GPU\n",
    "        labels = labels.to(device)  # 转到GPU\n",
    "        # 前向计算\n",
    "        logits = model(datas)\n",
    "        loss = loss_fct(logits, labels)  # 验证集损失,loss尺寸是一个数值\n",
    "        loss_list.append(loss.item())  # 记录损失,item是把tensor转换为数值\n",
    "\n",
    "        preds = logits.argmax(axis=-1)  # 验证集预测,argmax返回最大值索引\n",
    "        # print(preds)\n",
    "        pred_list.extend(preds.cpu().numpy().tolist())  #将PyTorch张量转换为NumPy数组。只有当张量在CPU上时，这个转换才是合法的\n",
    "        # print(preds.cpu().numpy().tolist())\n",
    "        label_list.extend(labels.cpu().numpy().tolist())\n",
    "\n",
    "    acc = accuracy_score(label_list, pred_list)  # 计算准确率\n",
    "    return np.mean(loss_list), acc\n"
   ],
   "outputs": [],
   "execution_count": 68
  },
  {
   "cell_type": "code",
   "source": "1875 * 20",
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-05T09:34:05.134812Z",
     "start_time": "2025-03-05T09:34:05.128522Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "37500"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 69
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T09:37:21.672567Z",
     "start_time": "2025-03-05T09:34:05.134812Z"
    }
   },
   "source": [
    "# 训练\n",
    "def training(model, train_loader, val_loader, epoch, loss_fct, optimizer, eval_step=500):\n",
    "    record_dict = {\n",
    "        \"train\": [],\n",
    "        \"val\": []\n",
    "    }\n",
    "\n",
    "    global_step = 0\n",
    "    model.train()\n",
    "    #tqdm是一个进度条库\n",
    "    with tqdm(total=epoch * len(train_loader)) as pbar:  # 进度条 1875*20,60000/32=1875\n",
    "        for epoch_id in range(epoch):  # 训练epoch次\n",
    "            # training\n",
    "            for datas, labels in train_loader:  #执行次数是60000/32=1875\n",
    "                datas = datas.to(device)  #datas尺寸是[batch_size,1,28,28]\n",
    "                labels = labels.to(device)  #labels尺寸是[batch_size]\n",
    "                # 梯度清空\n",
    "                optimizer.zero_grad()\n",
    "                # 模型前向计算\n",
    "                logits = model(datas)  # logits:命名是业界规则\n",
    "                # 计算损失\n",
    "                loss = loss_fct(logits, labels)  # 计算梯度\n",
    "                # 梯度回传，loss.backward()会计算梯度，loss对模型参数求导==求梯度\n",
    "                loss.backward()\n",
    "                # 调整优化器，包括学习率的变动等,优化器的学习率会随着训练的进行而减小，更新w,b\n",
    "                optimizer.step()  #梯度是计算并存储在模型参数的 .grad 属性中，优化器使用这些存储的梯度来更新模型参数\n",
    "\n",
    "                preds = logits.argmax(axis=-1)  # 训练集预测\n",
    "                # 每32个batch打印一次训练集准确率\n",
    "                acc = accuracy_score(labels.cpu().numpy(), preds.cpu().numpy())  # 计算准确率，numpy可以\n",
    "                loss = loss.cpu().item()  # 损失转到CPU，item()取值,一个数值\n",
    "\n",
    "                record_dict[\"train\"].append({\n",
    "                    \"loss\": loss, \"acc\": acc, \"step\": global_step\n",
    "                })  # 记录训练集信息，每一步的损失，准确率，步数\n",
    "\n",
    "                # evaluating\n",
    "                if global_step % eval_step == 0:\n",
    "                    model.eval()  # 进入评估模式\n",
    "                    val_loss, val_acc = evaluating(model, val_loader, loss_fct)\n",
    "                    record_dict[\"val\"].append({\n",
    "                        \"loss\": val_loss, \"acc\": val_acc, \"step\": global_step\n",
    "                    })\n",
    "                    model.train()  # 进入训练模式\n",
    "\n",
    "                # udate step\n",
    "                global_step += 1  # 全局步数加1\n",
    "                pbar.update(1)  # 更新进度条\n",
    "                pbar.set_postfix({\"epoch\": epoch_id})  # 设置进度条显示信息\n",
    "\n",
    "    return record_dict\n",
    "\n",
    "\n",
    "epoch = 20  #改为40\n",
    "model = model.to(device)\n",
    "record = training(model, train_loader, val_loader, epoch, loss_fct, optimizer, eval_step=1000)"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "  0%|          | 0/37500 [00:00<?, ?it/s]"
      ],
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "bb569d60ee464fa1a7f225e93da6ee62"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 70
  },
  {
   "cell_type": "code",
   "source": [
    "record[\"train\"][-5:]"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-05T09:37:21.676158Z",
     "start_time": "2025-03-05T09:37:21.672567Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'loss': 0.32057473063468933, 'acc': 0.875, 'step': 37495},\n",
       " {'loss': 0.1668422371149063, 'acc': 0.96875, 'step': 37496},\n",
       " {'loss': 0.40662288665771484, 'acc': 0.8125, 'step': 37497},\n",
       " {'loss': 0.22334064543247223, 'acc': 0.90625, 'step': 37498},\n",
       " {'loss': 0.17600491642951965, 'acc': 0.90625, 'step': 37499}]"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 71
  },
  {
   "cell_type": "code",
   "source": [
    "record[\"val\"][-5:]"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-05T09:37:21.683560Z",
     "start_time": "2025-03-05T09:37:21.676158Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'loss': np.float64(0.3693513929272612), 'acc': 0.8676, 'step': 33000},\n",
       " {'loss': np.float64(0.35607453491598273), 'acc': 0.8732, 'step': 34000},\n",
       " {'loss': np.float64(0.3616823465369951), 'acc': 0.8706, 'step': 35000},\n",
       " {'loss': np.float64(0.3557592223579891), 'acc': 0.8733, 'step': 36000},\n",
       " {'loss': np.float64(0.3550977635973939), 'acc': 0.8727, 'step': 37000}]"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 72
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T09:37:21.782822Z",
     "start_time": "2025-03-05T09:37:21.683560Z"
    }
   },
   "source": [
    "#画线要注意的是损失是不一定在零到1之间的\n",
    "def plot_learning_curves(record_dict, sample_step=1000):\n",
    "    # build DataFrame\n",
    "    train_df = pd.DataFrame(record_dict[\"train\"]).set_index(\"step\").iloc[::sample_step]\n",
    "    val_df = pd.DataFrame(record_dict[\"val\"]).set_index(\"step\")\n",
    "    last_step = train_df.index[-1]  # 最后一步的步数\n",
    "    # print(train_df.columns)\n",
    "    print(train_df['acc'])\n",
    "    print(val_df['acc'])\n",
    "    # plot\n",
    "    fig_num = len(train_df.columns)  # 画几张图,分别是损失和准确率\n",
    "    fig, axs = plt.subplots(1, fig_num, figsize=(5 * fig_num, 5))\n",
    "    for idx, item in enumerate(train_df.columns):\n",
    "        # print(train_df[item].values)\n",
    "        axs[idx].plot(train_df.index, train_df[item], label=f\"train_{item}\")\n",
    "        axs[idx].plot(val_df.index, val_df[item], label=f\"val_{item}\")\n",
    "        axs[idx].grid()  # 显示网格\n",
    "        axs[idx].legend()  # 显示图例\n",
    "        axs[idx].set_xticks(range(0, train_df.index[-1], 5000))  # 设置x轴刻度\n",
    "        axs[idx].set_xticklabels(map(lambda x: f\"{int(x / 1000)}k\", range(0, last_step, 5000)))  # 设置x轴标签\n",
    "        axs[idx].set_xlabel(\"step\")\n",
    "\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "plot_learning_curves(record)  #横坐标是 steps"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "step\n",
      "0        0.09375\n",
      "1000     0.68750\n",
      "2000     0.84375\n",
      "3000     0.81250\n",
      "4000     0.75000\n",
      "5000     0.87500\n",
      "6000     0.81250\n",
      "7000     0.87500\n",
      "8000     0.81250\n",
      "9000     0.87500\n",
      "10000    0.93750\n",
      "11000    0.84375\n",
      "12000    0.84375\n",
      "13000    0.84375\n",
      "14000    0.90625\n",
      "15000    0.81250\n",
      "16000    0.87500\n",
      "17000    0.84375\n",
      "18000    0.90625\n",
      "19000    0.87500\n",
      "20000    0.81250\n",
      "21000    0.87500\n",
      "22000    0.90625\n",
      "23000    0.90625\n",
      "24000    0.93750\n",
      "25000    0.90625\n",
      "26000    0.81250\n",
      "27000    0.96875\n",
      "28000    0.93750\n",
      "29000    0.87500\n",
      "30000    0.84375\n",
      "31000    0.93750\n",
      "32000    0.93750\n",
      "33000    0.93750\n",
      "34000    0.90625\n",
      "35000    0.93750\n",
      "36000    0.96875\n",
      "37000    0.87500\n",
      "Name: acc, dtype: float64\n",
      "step\n",
      "0        0.0834\n",
      "1000     0.6691\n",
      "2000     0.7591\n",
      "3000     0.8038\n",
      "4000     0.7994\n",
      "5000     0.8150\n",
      "6000     0.8263\n",
      "7000     0.8279\n",
      "8000     0.8310\n",
      "9000     0.8362\n",
      "10000    0.8419\n",
      "11000    0.8393\n",
      "12000    0.8416\n",
      "13000    0.8478\n",
      "14000    0.8462\n",
      "15000    0.8500\n",
      "16000    0.8504\n",
      "17000    0.8582\n",
      "18000    0.8565\n",
      "19000    0.8564\n",
      "20000    0.8563\n",
      "21000    0.8547\n",
      "22000    0.8562\n",
      "23000    0.8593\n",
      "24000    0.8623\n",
      "25000    0.8587\n",
      "26000    0.8580\n",
      "27000    0.8641\n",
      "28000    0.8667\n",
      "29000    0.8681\n",
      "30000    0.8714\n",
      "31000    0.8720\n",
      "32000    0.8704\n",
      "33000    0.8676\n",
      "34000    0.8732\n",
      "35000    0.8706\n",
      "36000    0.8733\n",
      "37000    0.8727\n",
      "Name: acc, dtype: float64\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ],
      "image/png": "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54qx2tqytXYGmDhxIvv27WtyGLarxMfHExIS0qidoXNjnTdvHt988w1r164lOjrafn9ERAR1dXUXlGZsqm1vuukmNmzYwMGDB7sk1qaMHDkS4IK27axYDQYDCQkJDBs2jIULFzJkyBDefvttl2zX5mJtSle3q7g47tw3uUu/BNI3dQTpmzqeO/VLLcXbFHfpm7pNomMwGBg2bBirV6+232exWFi9enWj+YW33HILn376Kb/+9a/5/PPPuyLUJlVUVJCRkUFkZKT9PleMtXfv3kRERDRq57KyMrZt29aonQHmzJnDq6++yi233NLmTzCc5eTJk5w9e7ZRO0PnxKqUYt68eSxfvpw1a9bQu3fvRseHDRuGXq9v1Lbp6elkZ2df0LavvvoqM2bMIDU11SkvJq3F2hTbfg/nt62zY22OxWKhtrbWpdq1tVib4mrtKtrGnfsmd+mXQPqmiyF9U+e9hrpTv3RuvE1xpXZtUZeVQXCCzz//XBmNRvXRRx+pgwcPqgceeEAFBgaq06dPK6UaVz754osvlKenZ6OKF53pscceU+vWrVOZmZlq8+bNasyYMSokJETl5+d3eazl5eVqz549as+ePQpQb7zxhtqzZ4+90surr76qAgMD1VdffaX27dunJk+erHr37q2qq6uVUhdWi3nzzTeVr6+v2rhxY6fGWl5erubPn6+2bNmiMjMz1apVq9TQoUNVYmKiqqmp6fRY58yZowICAtS6detUXl6e/VZVVWU/Z/bs2SomJkatWbNG7dy5U40aNUqNGjXKfvz8qiaPPPKICg8PV4cOHerUWI8dO6ZeeOEFtXPnTpWZmam++uorFR8fr0aPHt3psSql1JNPPqnWr1+vMjMz1b59+9STTz6pNBqN+vHHH5VSrtOurcXqau0qOoa79E2u3C8pJX2T9E3u1Te5U7/UWryu1K5t1a0SHaWUevfdd1VMTIwyGAxqxIgRauvWrfZj575IK6XU0qVLlaenp/rXv/7V6XHecccdKjIyUhkMBtWzZ091xx13qGPHjrlErLY/1vNvM2bMUEpZy3g+88wzKjw8XBmNRpWamqrS09Ptjz//BVoppV5//XXl5+enNm/e3GmxVlVVqRtvvFGFhoYqvV6vYmNj1f33329/c9HZsTYVJ6AWL15sP6e6ulo99NBDKigoSHl7e6spU6aovLy8C37fc0s1/uY3v1GRkZGN/g2cHWt2drYaPXq0Cg4OVkajUSUkJKjHH39clZaWdnqsSil13333qdjYWGUwGFRoaKhKTU21dyZKuU67tharq7Wr6Dju0De5cr+klPRN0je5V9/kTv1Sa/G6Uru2lUYppdo+DiSEEEIIIYQQrqvbrNERQgghhBBCCBtJdIQQQgghhBDdjiQ6QgghhBBCiG5HEh0hhBBCCCFEtyOJjhBCCCGEEKLbkURHCCGEEEII0e1IoiOEEEIIIYTodiTREUIIIYQQQnQ7kugIIYQQQgghuh1JdIToIDNnzuTWW2/t6jCEEEIIQPolISTREUIIIYQQQnQ7kugI0UZffvklycnJeHl50aNHD8aMGcPjjz/O3//+d7766is0Gg0ajYZ169YBkJOTw+23305gYCDBwcFMnjyZrKws+/PZPnF7/vnnCQ0Nxd/fn9mzZ1NXV9c1v6AQQgi3Iv2SEE3z6OoAhHAneXl5TJs2jUWLFjFlyhTKy8vZuHEj99xzD9nZ2ZSVlbF48WIAgoODMZlMjBs3jlGjRrFx40Y8PDx46aWXGD9+PPv27cNgMACwevVqPD09WbduHVlZWdx777306NGDl19+uSt/XSGEEC5O+iUhmieJjhBtkJeXR319PVOnTiU2NhaA5ORkALy8vKitrSUiIsJ+/ieffILFYuGDDz5Ao9EAsHjxYgIDA1m3bh033ngjAAaDgQ8//BBvb2+SkpJ44YUXePzxx3nxxRfRamXgVQghRNOkXxKiefKXKkQbDBkyhNTUVJKTk7ntttv429/+RnFxcbPn7927l2PHjuHn54evry++vr4EBwdTU1NDRkZGo+f19va2/zxq1CgqKirIyclx6u8jhBDCvUm/JETzZERHiDbQ6XSsXLmS//73v/z444+8++67PP3002zbtq3J8ysqKhg2bBhLliy54FhoaKizwxVCCNHNSb8kRPMk0RGijTQaDVdddRVXXXUVCxYsIDY2luXLl2MwGDCbzY3OHTp0KEuXLiUsLAx/f/9mn3Pv3r1UV1fj5eUFwNatW/H19aVXr15O/V2EEEK4P+mXhGiaTF0Tog22bdvGK6+8ws6dO8nOzmbZsmUUFBQwYMAA4uLi2LdvH+np6RQWFmIymZg+fTohISFMnjyZjRs3kpmZybp16/if//kfTp48aX/euro6Zs2axcGDB1mxYgXPPvss8+bNk3nQQgghWiT9khDNkxEdIdrA39+fDRs28NZbb1FWVkZsbCyvv/46EyZMYPjw4axbt47hw4dTUVHB2rVrue6669iwYQO/+93vmDp1KuXl5fTs2ZPU1NRGn6SlpqaSmJjI6NGjqa2tZdq0aTz33HNd94sKIYRwC9IvCdE8jVJKdXUQQlzKZs6cSUlJCf/+97+7OhQhhBBC+iXRbcj4oxBCCCGEEKLbkURHCCGEEEII0e3I1DUhhBBCCCFEtyMjOkIIIYQQQohuRxIdIYQQQgghRLcjiY4QQgghhBCi25FERwghhBBCCNHtSKIjhBBCCCGE6HYk0RFCCCGEEEJ0O5LoCCGEEEIIIbodSXSEEEIIIYQQ3c7/B78dPjvt2lZYAAAAAElFTkSuQmCC"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 73
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 评估"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T09:37:22.576614Z",
     "start_time": "2025-03-05T09:37:21.783825Z"
    }
   },
   "source": [
    "# dataload for evaluating\n",
    "\n",
    "model.eval()  # 进入评估模式\n",
    "loss, acc = evaluating(model, val_loader, loss_fct)\n",
    "print(f\"loss:     {loss:.4f}\\naccuracy: {acc:.4f}\")"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss:     0.3542\n",
      "accuracy: 0.8729\n"
     ]
    }
   ],
   "execution_count": 74
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
